#include <iostream>

using namespace std;

template<typename T>
struct myIterator
{
    typedef T value_type;

    T *ptr;

    myIterator(T *p = nullptr) : ptr(p) {}

    T &operator*() const
    {
        return *ptr;
    }
};

// iterator是模板类，这里的iterator_type指的是迭代器类型，比如myIterator<int>
template<typename iterator_type>
struct iterator_trait
{
    typedef typename iterator_type::value_type value_type;
};

// iterator是原生指针, 这里的iterator_value_type是原生指针指向的value_type,特化版本
template<typename iterator_value_type>
struct iterator_trait<iterator_value_type *> // I is pointer to iterator_value_type
{
    typedef iterator_value_type value_type;
};

// iterator是常量指针， 特化版本
template<typename iterator_value_type>
struct iterator_trait<const iterator_value_type *> // I is const pointer to iterator_value_type
{
    // 注意是iterator_value_type而不是const iterator_value_type
    typedef iterator_value_type value_type;
};

template<typename I>
typename iterator_trait<I>::value_type func(I &it)
{
    return *it;
}

int main()
{
    myIterator<int> it(new int(6));
    cout << func(it) << endl;

    int *p = new int(7);
    cout << func(p) << endl;
}